package com.wr.regexp;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

// 分析java正则表达式底层实现（重要）
public class RegTheory_2 {
    public static void main(String[] args) {

        String str = "1998年12月8日，第二代Java平台的企业版J2EE发布。1999年6月，Sun公司发布了第二代Java平台（简称为Java2）" +
                "的3个版本：J2ME（Java2 Micro Edition，Java2平台的微型版），应用于移动、无线及有限资源的环境；J2SE（Java 2 Standard Edition，Java 2平台的标准版）" +
                "，应用3443于桌面环境；J2EE（Java 2Enterprise Edition，Java 2平台的企业版），应用于基于Java的应用服务器。Java 2平台的发布，是Java发展过程中最重要的一个里程碑" +
                "，标志着Java的应用开始普及9889。";


        // 匹配所有4个数字
        // \\d表示任意数字
        // 加小括号就是分组的意思(group(0)就是取全部，group（1）就是取第一个分组 group（2）就是取第二个分组)
        String regStr = "(\\d\\d)(\\d\\d)";
        Pattern pattern = Pattern.compile(regStr);
        Matcher matcher = pattern.matcher(str);
        /**
         *
         * matcher.find() 这个方法做了什么事
         * 1.根据制定的规则，来定位满足规则的子字符串（比如1998）
         * 2.找到之后，它会把子字符串的开始索引记录到Matcher对象的属性中（int[] groups;）
         *   groups【0】 = 0 ，把符合匹配的子字符串结束的索引+1 记录到 groups【1】 = 4
         * 3.同时把oldLast的值也记录成子字符串结束的索引+1  ==4  ，下次再执行find的时候 就从下标4开始继续匹配
         *
         *
         *
         * matcher.group(0) 分析
         * 源码：if (first < 0)
         *             throw new IllegalStateException("No match found");
         *         if (group < 0 || group > groupCount())
         *             throw new IndexOutOfBoundsException("No group " + group);
         *         if ((groups[group*2] == -1) || (groups[group*2+1] == -1))
         *             return null;
         *         return getSubSequence(groups[group * 2], groups[group * 2 + 1]).toString();
         *
         * 1.group(0)方法返回的就是 groups【0】-groups【1】 即【0,4）
         *
         * 2.第二次执行find（）方法的时候，找到了就会覆盖掉groups【0】和groups【1】
         *
         * 3.如果正则表达式有小括号（），代表分组的意思,比如1998这个数  group(0)=1998  group(1)=19  group(2)=98
         *   groups【2】 =0  groups【3】 = 2
         *
         *
         */
        while (matcher.find()){
            System.out.println("找到："+matcher.group(0));
        }
    }
}
